#pragma once
#include <string>
#include <vector>
#include <map>
#include <set>
#include <mutex>
#include <memory>

#include "cppjieba/Jieba.hpp"

struct PageResult {
    int docId;
    std::string title;
    std::string link;
    std::string abstract;  // 摘要
    double score;          // 相似度得分
};

class PageSearch {
public:
    PageSearch();
    ~PageSearch() = default;
    
    // 初始化：加载倒排索引、网页库和网页偏移库
    bool init(const std::string& invertedIndexPath, 
              const std::string& pagesPath, 
              const std::string& offsetsPath);
    
    // 搜索网页
    std::vector<PageResult> search(const std::string& query, int count = 10);
    
private:
    // 解析网页偏移库
    bool parseOffsets(const std::string& path);
    
    // 从网页库中读取文档内容
    bool getDocument(int docId, std::string& title, std::string& content, std::string& link);
    
    // 对查询进行分词，获取关键词及权重
    std::map<std::string, double> processQuery(const std::string& query);
    
    // 计算TF-IDF值
    double calculateTFIDF(int tf, int df, int totalDocs);
    
    // 生成摘要
    std::string generateAbstract(const std::string& content, const std::set<std::string>& keywords);
    
    // 加载停用词
    bool loadStopWords(const std::string& path = "resources/corpus/stopwords/cn_stopwords.txt");
    
private:
    cppjieba::Jieba m_tokenizer;           // 分词器
    std::set<std::string> m_stopWords;     // 停用词集合
    
    // 倒排索引: 关键词 -> {文档ID -> 权重}
    std::map<std::string, std::map<int, double>> m_invertedIndex;
    
    // 网页偏移: 文档ID -> {偏移量, 大小}
    std::map<int, std::pair<size_t, size_t>> m_offsets;
    
    std::string m_pagesPath;               // 网页库路径
    std::mutex m_mutex;                    // 保护数据访问的互斥锁
    int m_totalDocs;                       // 总文档数
};
